<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>闭包的原理</title>
    <script>
        /* 
            函数的外层作用域在函数创建时就已经确定了（词法作用域）
                和调用的位置无关，和创建的地方有关。

                闭包利用的就是词法作用域。
        
        */

        let a='全局变量a'

        function fn(){
            console.log(a)
        }

        fn2=()=>{
            let a='fn2中的a'
            fn()        // 这里找外层作用域时，不是看函数在谁内部调用的，而是看创建的地方，fn的外层作用域定义的变量是全局变量。
        }
        fn2()


        function fn3(){
            let a='fn3中的a'

            function fn4(){
                console.log(a)    // 这里fn4内层没有自己的a，就会在创建时的外层去寻找，所以这里会输出'fn3中的a'
            }
            fn4()
        }

        fn3()

        fn5=()=>{
            let a='fn5中的a'
            fn6=()=>{
                console.log(a)
            }
            
            return fn6    
        }

        fn6=fn5()       //这里是将fn6函数做为fn5函数的执行结果返回，所以有这个等式
        fn6()    //调用fn6()的时候，只看fn6在哪儿创建的，内层没有变量，再去创建时的外层找，所以这里fn6()的执行结果为'fn5中的a'


    </script>
</head>
<body>
    
</body>
</html>